{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## **演示0505：使用scipy.optimize包求解函数的极值**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### **案例1：计算函数$f(x)=x^2+x$和$f(x)=x^3$的极小值**\n",
    "> 对于单变量函数的极值，可直接使用*scipy.optimize.minimize_scalar*方法求解"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "函数【f=x*x+x】极值点： -0.5 最小值： -0.25\n",
      "函数【f=x*x*x】极值点： -1.0737622077212198e+103 最小值： -inf\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\iahuo\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\ipykernel_launcher.py:10: RuntimeWarning: overflow encountered in double_scalars\n",
      "  # Remove the CWD from sys.path while we load stuff.\n"
     ]
    }
   ],
   "source": [
    "''' 使用minimize_scalar方法求函数极小值 '''\n",
    "\n",
    "import numpy as np\n",
    "from scipy.optimize import minimize_scalar\n",
    "\n",
    "def f1(x):\n",
    "    return x*x+x\n",
    "\n",
    "def f2(x):\n",
    "    return x*x*x\n",
    "\n",
    "res = minimize_scalar(f1)\n",
    "print(\"函数【f=x*x+x】极值点：\", res.x, \"最小值：\", res.fun)\n",
    "\n",
    "res = minimize_scalar(f2)\n",
    "print(\"函数【f=x*x*x】极值点：\", res.x, \"最小值：\", res.fun) # 事实上该函数并没有收敛"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### **案例2：计算函数$f(x)=100-x^2$的极大值**\n",
    ">求最大值时，一般转换为求其相反值得最小值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "函数极值点： -4.849742195555412e-08 最大值： -100.0\n"
     ]
    }
   ],
   "source": [
    "''' 使用minimize_scalar方法求函数极大值 '''\n",
    "\n",
    "import numpy as np\n",
    "from scipy.optimize import minimize_scalar\n",
    "\n",
    "def f1(x, sign):\n",
    "    return sign*(100 - x*x)\n",
    "\n",
    "res = minimize_scalar(f1, args=(-1))\n",
    "print(\"函数极值点：\", res.x, \"最大值：\", res.fun)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### **案例3：计算函数$f(x)=x^3$在区间[3, 5]上的极小值**\n",
    ">*bounds*参数可以指定自变量的区间范围"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "函数极值点： 3.0000039901987505 最小值： 27.000107735509562\n"
     ]
    }
   ],
   "source": [
    "''' 使用minimize_scalar方法求函数在某个区间上的极值 '''\n",
    "\n",
    "import numpy as np\n",
    "from scipy.optimize import minimize_scalar\n",
    "\n",
    "def f1(x):\n",
    "    return x*x*x\n",
    "\n",
    "res = minimize_scalar(f1, bounds=(3.0, 5.0), method='bounded')\n",
    "print(\"函数极值点：\", res.x, \"最小值：\", res.fun)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### **案例4：多元函数在区间上的极值**\n",
    "> 计算函数$f(x_1, x_2)=3 x_1^2 + 5 x_1 x_2 + 2 x_2^2 - 8 x_1 - 10 x_2 + 6$在$x_1 \\in [0, +\\infty)$和$x_2 \\in [0, +\\infty)$区间上的极小值  \n",
    "* 如果是多变量函数，则必须使用*minimize*方法\n",
    "* 在定义目标函数时，传入的第一个参数$x$是一个向量，分别代表了每个变量\n",
    "* 必须要给定初始值\n",
    "* 在指定*bounds*时，必须以*tuple*的形式依次描述每个变量的值域。对于$+\\infty$和$−\\infty$，可以使用None来代替，取决于它与区间另一端的位置关系\n",
    "* 要设定*bounds*，求解器必须是'L-BFGS-B'、'TNC'或者'SLSQP'。若未指定求解器，*minimize*方法会自动选择合适得求解器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "函数极值点： [0.         2.50000012] 最小值： -6.499999999999972\n"
     ]
    }
   ],
   "source": [
    "''' 使用minimize计算多元函数在指定区间上的极值 '''\n",
    "\n",
    "import numpy as np\n",
    "from scipy.optimize import minimize\n",
    "\n",
    "# f(x1, x2) = 3*x1*x1 + 5*x1*x2 + 2*x2*x2 - 8*x1 - 10*x2 + 6\n",
    "def f1(x):\n",
    "    return 3*x[0]*x[0] + 5*x[0]*x[1] + 2*x[1]*x[1] - 8*x[0] - 10*x[1] + 6\n",
    "\n",
    "init_x = [1.5, 0.5]\n",
    "bnds = ((0, None), (0, None))\n",
    "res = minimize(f1, init_x, bounds=bnds, options={'disp':True})\n",
    "print(\"函数极值点：\", res.x, \"最小值：\", res.fun)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### **案例5：多元函数带约束条件的极值**\n",
    ">计算函数$f(x_1, x_2, x_3)=2 x_1^2 + 3 x_2^2 + 7 x_3^2$在约束条件：$ 2 x_1 + x_2 = 1$ 和$2 x_2 + x_3 = 1$下的极值  \n",
    "* constraints参数可以指定约束条件\n",
    "* 对于\"=\"约束条件，设定type为'eq'，并给出令$h(x) = 0$的约束表达式\n",
    "* 对于\"$\\leq$\"约束条件，设定type为'ineq'，并给出令$h(x) \\leq 0$的约束表达式。不存在\">\"条件约束，在这种情况下，要设法转为\"$\\leq$\"约束\n",
    "* 如果使用约束条件，那么求解器必须是'COBYLA'或'SLSQP'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     fun: 1.6386554640302917\n",
      "     jac: array([0.90752964, 3.27741121, 4.23513828])\n",
      " message: 'Optimization terminated successfully.'\n",
      "    nfev: 22\n",
      "     nit: 4\n",
      "    njev: 4\n",
      "  status: 0\n",
      " success: True\n",
      "       x: array([0.2268824 , 0.54623519, 0.30250987])\n"
     ]
    }
   ],
   "source": [
    "''' 使用minimize计算多元函数在多个约束条件下的极值 '''\n",
    "\n",
    "import numpy as np\n",
    "from scipy.optimize import minimize\n",
    "def target(x):\n",
    "    return 2*x[0]*x[0] + 3*x[1]*x[1] + 7*x[2]*x[2]\n",
    "\n",
    "cons = (\n",
    "{'type':'eq', 'fun':lambda x: np.array([2*x[0]+x[1]-1])},\n",
    "{'type':'eq', 'fun':lambda x: np.array([2*x[1]+3*x[2]-2])})\n",
    "\n",
    "init_x = [0.1,0.2,0.5] # 假定的初始最优值\n",
    "res = minimize(target, init_x, method='SLSQP', constraints=cons)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### **案例6：使用minimize求解拟合公式的最优系数向量**\n",
    "> minimize方法可以用来对多元函数拟合的权重参数的求解"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 2.98829862 -5.00357605  2.00808206 -7.99727562 -9.97410052  6.49867435]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x259880bbef0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "''' 使用scipy的minimize方法进行多元高阶拟合 '''\n",
    "\n",
    "import numpy as np\n",
    "import scipy.optimize as opt\n",
    "import matplotlib.pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "%matplotlib inline\n",
    "\n",
    "def f(x1, x2):\n",
    "    # np.random.random()是为了给样本数据一个小的扰动\n",
    "    return 3 * x1 * x1 - 5 * x1 * x2 + 2 * x2 * x2 - 8 * x1 - 10 * x2 + 6 + np.random.random()\n",
    "\n",
    "# 此处的X_ext必须是已经形成x1*x1, x1*x2，x2*x2,x1,x2,1共6列的数据矩阵\n",
    "def fit_function(W, X_ext):\n",
    "    return np.dot(X_ext, W)\n",
    "\n",
    "# 最小化目标函数。残差的平方和除以2m\n",
    "def target_function(W, X_ext, y):\n",
    "    temp = fit_function(W, X_ext) - y\n",
    "    return temp.dot(temp) / (2 * len(X_ext))\n",
    "\n",
    "# 下列函数利用拟合出来的W参数对新的X1和X2数据进行计算\n",
    "def predict_function(W, X1, X2):\n",
    "    return W[0] * X1 * X1 + W[1] * X1 * X2 + W[2] * X2 * X2 + W[3] * X1 + W[4] * X2 + W[5]\n",
    "\n",
    "x1 = np.linspace(-3, 3, 6)\n",
    "x2 = np.linspace(-3, 3, 6)\n",
    "\n",
    "POLY_COUNT = 6                      # 2阶多项式一共6项\n",
    "def map_data(X1, X2):           # 生成两个变量的高阶矩阵\n",
    "    variables = np.ones((len(X1) * len(X2), POLY_COUNT))\n",
    "    y = np.zeros((len(X1)*len(X2)))\n",
    "    row_index = 0\n",
    "    for i in np.arange(len(X1)):\n",
    "        for j in np.arange(len(X2)):\n",
    "            row = variables[row_index]\n",
    "            row[0] = X1[i] * X1[i]\n",
    "            row[1] = X1[i] * X2[j]\n",
    "            row[2] = X2[j] * X2[j]\n",
    "            row[3] = X1[i]\n",
    "            row[4] = X2[j]\n",
    "            y[row_index] = f(X1[i], X2[j])\n",
    "            #row[5] = 1\n",
    "            row_index += 1\n",
    "    return (variables, y)\n",
    "\n",
    "w_init = np.random.randn(POLY_COUNT)\n",
    "x_ext, y = map_data(x1, x2)\n",
    "result = opt.minimize(target_function, w_init, args=(x_ext, y))\n",
    "w = result.x\n",
    "print(w)                # 拟合参数应接近：[  3.  -5.   2.  -8. -10.   6.]\n",
    "\n",
    "\n",
    "ax = plt.figure().add_subplot(111, projection = '3d')  \n",
    "x_grid = np.meshgrid(x1, x2)\n",
    "ax.scatter(x_grid[0], x_grid[1], y)                             # 绘制散点\n",
    "\n",
    "# 使用拟合函数计算曲面上的点阵\n",
    "x1_fit = np.linspace(-3, 3, 12)\n",
    "x2_fit = np.linspace(-3, 3, 12)\n",
    "x_fit_grid = np.meshgrid(x1_fit, x2_fit)\n",
    "y_fit = predict_function(w, x_fit_grid[0], x_fit_grid[1])\n",
    "ax.plot_surface(x_fit_grid[0], x_fit_grid[1], y_fit)            # 绘制曲面\n",
    "\n",
    "ax.set_xlabel('X1')  \n",
    "ax.set_ylabel('X2')  \n",
    "ax.set_zlabel('Y')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
